package com.example.spring.bean.load01config;

import com.example.spring.pojo.User;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 使用 Configuration 注解方式 加载 bean
 * <p>  @Configuration+@Bean 配置 bean ,
 * <p>  使用 AnnotationConfigApplicationContext(Class) 读取指定配置类
 * <p>
 */
public class AnnoSpringDemo {

    public static void main(String[] args) {

        // 告诉容器要加载的配置类是哪个
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(InitConfig.class);

        //通过 beanName(beanId) 获取 bean 实例
        User user1 = (User) applicationContext.getBean("conf01");
        //通过 对象类型 获取 bean 实例
        User user2 = applicationContext.getBean(User.class);

        //输出检验是不是自己设定的bean，并检验是不是单例
        System.out.println(user1); //User{id=1, name='conf01'}
        System.out.println(user2); //User{id=1, name='conf01'}
        System.out.println(user1 == user2); //true 说明是同一个实例
        
        applicationContext.close();
    }
}

/**
 * 使用注解方式配置bean，类似beans.xml
 *
 * <p> @Configuration注解用来告诉容器，此类是一个配置类，==配置文件。
 * 这样容器启动的时候，会自动扫描这个类，把配置的bean加载到容器中
 * <p>
 */
@Configuration
class InitConfig {


    /**
     * Bean注解 是向容器中注册了一个bean实例,bean类型为返回值的类型,
     * 默认情况下 方法名称 就是 beanName,也可以通过 name 来指定 beanName
     */
//    @Bean(name = "customName")
    @Bean
    public User conf01() {
        User user = new User();
        user.setName("conf01");
        user.setId(1);
        return user;
    }
}
